#指定CMAKE最低版本至少为2.6
cmake_minimum_required(VERSION 2.6)

#项目名称是WebServer，项目使用语言为C和C++
project(WebServer C CXX)

#是否有CMAKE的构建类型，如果没有则设置为Release
if(NOT CMAKE_BUILD_TYPE)
  set(CMAKE_BUILD_TYPE "Release")
endif()

#项目包含的文件夹，当寻找头文件时从这些目录下查找
include_directories(
  Base 
  Http 
  Logging 
  Timer 
  Util
)

#定义编译器选项，-g生成调试信息，-Wall开启所有警告
SET(CXX_FLAGS
  -g
  -Wall
  -Wextra
  -Werror
  -Wconversion
  -Wshadow
  -std=c++11
)


#CMAKE string的语法是 string(OPERATION [INPUT] [OUTPUT])
#OPERATION是要执行的字符串操作，例如REPLACE、TOUPPER、TOLOWER、STRIP(除去编译链接时生成的符号表和调试信息，一般在程序发布时使用，减小发布文件的大小)、FIND、SUBSTRING等
#INPUT 要执行操作的字符串或变量 OUTPUT指操作结果存储的变量名
string(REPLACE ";" " " CMAKE_CXX_FLAGS "${CXX_FLAGS}")
string(TOUPPER ${CMAKE_BUILD_TYPE} BUILD_TYPE)

#DEBUG版本不优化，release版本开-O3优化
set(CMAKE_CXX_COMPILER "g++")
set(CMAKE_CXX_FLAGS_DEBUG "-O0")
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")

#查找Threads包，用于多线程编程
find_package(Threads REQUIRED)

#打印出当前编译选项和依赖库等信息
message(STATUS "CXX_FLAGS = " ${CMAKE_CXX_FLAGS} " " ${CMAKE_CXX_FLAGS_${BUILD_TYPE}})
message(STATUS "CMAKE_THREAD_LIBS_INIT = " ${CMAKE_THREAD_LIBS_INIT})

#aux即 "auxiliary"辅助，这一命令会将目录下所有文件添加到指定变量中，它还支持通配符操作来包含或排除特定文件模式
aux_source_directory(Base SRC_LIST1)
aux_source_directory(Http SRC_LIST2)
aux_source_directory(Logging SRC_LIST3)
aux_source_directory(Timer SRC_LIST4)
aux_source_directory(Util SRC_LIST5)

#设置执行路径为项目源目录
set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR})
#执行
add_executable(WebServer main.cc ${SRC_LIST1} ${SRC_LIST2} ${SRC_LIST3} ${SRC_LIST4} ${SRC_LIST5})

#项目链接到线程库
target_link_libraries(${PROJECT_NAME}  ${CMAKE_THREAD_LIBS_INIT})